/**
TODO：es6对象的操作:
 Object.keys(obj)      //获取obj中的key 并以数组的形式返回
 Object.values(obj)   //获取obj中的value 并以数组的形式返回
 Object.assign()     //对于普通的对象是深拷贝，复杂的对象的浅拷贝
 Object.is()        //类似===，但Object.is(+0,-0) :false,Object.is(NaN,NaN):true与===相反。+0 === -0 :true,NaN === NaN :FALSE
 判断对象是否为空?   //Object.keys(obj).length ;JSON.stringify(obj) === '{}';Object.getOwnPropertyNames(obj).length
*/

/**
 * Object.assign()
 * 如果该函数只有一个参数，当参数为对象时，直接返回该对象；当参数不是对象时，会先将参数转为对象然后返回。
 * Object.assign(3);         // Number {3}
   typeof Object.assign(3);  // "object"
   因为 null 和 undefined 不能转化为对象，所以会报错:
   Object.assign(null);       // TypeError: Cannot convert undefined or null to object
   Object.assign(undefined); 

   当参数不止一个时，null 和 undefined 不放第一个，即不为目标对象时，会跳过 null 和 undefined ，不报错
   Object.assign(1,undefined);  // Number {1}
   Object.assign({a: 1},null);  // {a: 1}

   如果第一个参数非引用数据类型
   第一个参数 1 是原始值（数字类型），会被 Object.assign 隐式转换为包装对象 new Number(1)
   Object.assign(1,{a:1});  // Number {1,a:1}
   Object.assign('abc',{a:1});  // String {'abc',a:1}
   Object.assign(NaN,{a:1});  // Number {NaN,a:1}


   数组的处理
   Object.assign([2,3], [5]);  // [5,3]
   会将数组处理成对象，所以先将 [2,3] 转为 {0:2,1:3} ，然后再进行属性复制，所以源对象的 0 号属性覆盖了目标对象的 0。
*/


const obj = {
    name:'xx',
    age:18
}
console.log(Object.keys(obj))  //[ 'name', 'age' ]

Object.defineProperty(obj,'name',{
    value:'xxx',
    writable:true,
    enumerable:true,
    configurable:false
})
console.log(Object.keys(obj))
console.log(obj,'obj')


/**
 * Object.entries()
 * 将指定的对象转换成一个数组，数组的元素是由键值组成的数组(二维数组)
*/
console.log(Object.entries(obj)) //[['name','xxx'],['age',18]]


/**
 * Object.fromEntries()
 * 将一个数组，数组的元素是由键值组成的数组（二维数组）转换成由键值组成的对象
*/

console.log(Object.fromEntries(Object.entries(obj))) //{ name: 'xxx', age: 18 }
console.log(Object.fromEntries([['a','1']]))


console.log(Object.assign([1,2],[1,3,5]))  //[1,3,5]